<!DOCTYPE html>

<html
  xmlns="http://www.w3.org/1999/xhtml"
  >
  <head>
    <title>Hierarchical edge bundling &#8211; from Data to Viz</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="generator" content="pandoc" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <meta
      name="description"
      content="An extensive description of Hierarchical edge
bundling. Definition, examples, input data, common caveats, tool to build it and potential alternatives."
    />
    <meta
      name="keywords"
      content="Data,Dataviz,Datavisualization,Plot,Chart,Graph,R,Python,D3,Learning,Caveat,Pitfall,Mistake,Classification"
    />
    <meta name="author" content="Yan Holtz and Conor Healy" />
    <link rel="icon" href="img/logo/data-to-viz.ico" />

    <!-- Control appearance when share by social media -->
    <meta property="og:title" content="Hierarchical edge bundling" />
    <meta
      property="og:image"
      content="https://github.com/holtzy/data_to_viz/raw/master/img/section/BundleSmall.png"
    />
    <meta
      property="og:description"
      content="An extensive description of Hierarchical edge
bundling. Definition, examples, input data, common caveats, tool to build it and potential alternatives."
    />
    <meta
      property="og:url"
      content="www.data-to-viz.com/caveat/edge_bundling.html"
    />
    <meta property="og:type" content="website" />

    <style>
      .myheader {
        background-image: url("https://github.com/holtzy/data_to_viz/raw/master/img/overview_RGG_faded.png");
        min-height: 300px;
        background-size: 100% 100%;

        /* Create the parallax scrolling effect */
        background-attachment: fixed;
        background-position: center;
        background-repeat: no-repeat;
        background-size: cover;

        height: 100%;
        width: 100% !important;
      }
      .mytitle {
        text-transform: uppercase;
        font-family: "Montserrat";
        font-size: 200%;
        font-weight: 500;
        letter-spacing: 4px;
      }
    </style>

    <div class="myheader" style="text-align: center">
      <br />
      <a href="http://www.data-to-viz.com"
        ><img
          align="left"
          src="https://github.com/holtzy/data_to_viz/raw/master/img/logo/typo.png"
          style="width: 150px; vertical-align: top; margin-left: 5%"
      /></a>
      <br /><br />
      <br /><br />
      <a href="http://www.data-to-viz.com">
        <img
          src="https://github.com/holtzy/data_to_viz/raw/master/img/section/BundleSmall.png"
      /></a>
      <br /><br />
      <p class="mytitle">Hierarchical edge bundling</p>
      <p style="color: #d0d0d0">
        <a href="#definition">definition</a> - <a href="#mistake">mistake</a> -
        <a href="#related">related</a> -
        <a href="#code">code</a>
      </p>
    </div>

         <script src="libs/header-attrs-2.27/header-attrs.js"></script>
<script src="libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="libs/bootstrap-3.3.5/css/lumen.min.css" rel="stylesheet" />
<script src="libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="libs/bootstrap-3.3.5/shim/respond.min.js"></script>
<style>h1 {font-size: 34px;}
       h1.title {font-size: 38px;}
       h2 {font-size: 30px;}
       h3 {font-size: 24px;}
       h4 {font-size: 18px;}
       h5 {font-size: 16px;}
       h6 {font-size: 12px;}
       code {color: inherit; background-color: rgba(0, 0, 0, 0.04);}
       pre:not([class]) { background-color: white }</style>
<script src="libs/navigation-1.1/tabsets.js"></script>
<script src="libs/navigation-1.1/codefolding.js"></script>
<link href="libs/pagedtable-1.1/css/pagedtable.css" rel="stylesheet" />
<script src="libs/pagedtable-1.1/js/pagedtable.js"></script>       <style type="text/css">
      code {
        white-space: pre;
      }
    </style>
    <style type="text/css">
      pre > code.sourceCode { white-space: pre; position: relative; }
      pre > code.sourceCode > span { line-height: 1.25; }
      pre > code.sourceCode > span:empty { height: 1.2em; }
      .sourceCode { overflow: visible; }
      code.sourceCode > span { color: inherit; text-decoration: inherit; }
      div.sourceCode { margin: 1em 0; }
      pre.sourceCode { margin: 0; }
      @media screen {
      div.sourceCode { overflow: auto; }
      }
      @media print {
      pre > code.sourceCode { white-space: pre-wrap; }
      pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
      }
      pre.numberSource code
        { counter-reset: source-line 0; }
      pre.numberSource code > span
        { position: relative; left: -4em; counter-increment: source-line; }
      pre.numberSource code > span > a:first-child::before
        { content: counter(source-line);
          position: relative; left: -1em; text-align: right; vertical-align: baseline;
          border: none; display: inline-block;
          -webkit-touch-callout: none; -webkit-user-select: none;
          -khtml-user-select: none; -moz-user-select: none;
          -ms-user-select: none; user-select: none;
          padding: 0 4px; width: 4em;
          color: #aaaaaa;
        }
      pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
      div.sourceCode
        {   }
      @media screen {
      pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
      }
      code span.al { color: #ff0000; font-weight: bold; } /* Alert */
      code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
      code span.at { color: #7d9029; } /* Attribute */
      code span.bn { color: #40a070; } /* BaseN */
      code span.bu { color: #008000; } /* BuiltIn */
      code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
      code span.ch { color: #4070a0; } /* Char */
      code span.cn { color: #880000; } /* Constant */
      code span.co { color: #60a0b0; font-style: italic; } /* Comment */
      code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
      code span.do { color: #ba2121; font-style: italic; } /* Documentation */
      code span.dt { color: #902000; } /* DataType */
      code span.dv { color: #40a070; } /* DecVal */
      code span.er { color: #ff0000; font-weight: bold; } /* Error */
      code span.ex { } /* Extension */
      code span.fl { color: #40a070; } /* Float */
      code span.fu { color: #06287e; } /* Function */
      code span.im { color: #008000; font-weight: bold; } /* Import */
      code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
      code span.kw { color: #007020; font-weight: bold; } /* Keyword */
      code span.op { color: #666666; } /* Operator */
      code span.ot { color: #007020; } /* Other */
      code span.pp { color: #bc7a00; } /* Preprocessor */
      code span.sc { color: #4070a0; } /* SpecialChar */
      code span.ss { color: #bb6688; } /* SpecialString */
      code span.st { color: #4070a0; } /* String */
      code span.va { color: #19177c; } /* Variable */
      code span.vs { color: #4070a0; } /* VerbatimString */
      code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
            div.sourceCode {
        overflow-x: visible;
      }
          </style>
        <style type="text/css">
      pre:not([class]) {
        background-color: white;
      }
    </style>
           <style type="text/css">
      h1 {
        font-size: 34px;
      }
      h1.title {
        font-size: 38px;
      }
      h2 {
        font-size: 30px;
      }
      h3 {
        font-size: 24px;
      }
      h4 {
        font-size: 18px;
      }
      h5 {
        font-size: 16px;
      }
      h6 {
        font-size: 12px;
      }
      .table th:not([align]) {
        text-align: left;
      }
          </style>
         <link
      rel="stylesheet"
      href="style.css"
      type="text/css"
      
    />
      </head>

  <body>
        <style type="text/css">
      .main-container {
        max-width: 940px;
        margin-left: auto;
        margin-right: auto;
      }
      code {
        color: inherit;
        background-color: rgba(0, 0, 0, 0.04);
      }
      img {
        max-width: 100%;
        height: auto;
      }
      .tabbed-pane {
        padding-top: 12px;
      }
      button.code-folding-btn:focus {
        outline: none;
      }
    </style>

     
    <div class="container-fluid main-container">
      <!-- tabsets -->
      <script>
        $(document).ready(function () {
          window.buildTabsets("TOC");
        });
      </script>

      <!-- code folding -->
            <style type="text/css">
        .code-folding-btn {
          margin-bottom: 4px;
        }
      </style>
      <script>
        $(document).ready(function () {
                          window.initializeCodeFolding("hide" === "show");
                });
      </script>
         
                    <div class="fluid-row" id="header">
                        <div class="btn-group pull-right">
              <button
                type="button"
                class="btn btn-default btn-xs dropdown-toggle"
                data-toggle="dropdown"
                aria-haspopup="true"
                aria-expanded="false"
              >
                <span>Show Code</span> <span class="caret"></span>
              </button>
              <ul class="dropdown-menu" style="min-width: 50px">
                                <li><a id="rmd-show-all-code" href="#">Show All Code</a></li>
                <li><a id="rmd-hide-all-code" href="#">Hide All Code</a></li>
                                </ul>
            </div>

                         </div>

              <div class="mycontent">
<div id="definition" class="section level1">
<h1>Definition</h1>
<hr />
<p><code>Hierarchical Edge Bundling</code> allows to visualize
<code>adjacency relations</code> between entities organized in a
<code>hierarchy</code>. The idea is to bundle the adjacency edges
together to decrease the clutter usually observed in complex
networks.</p>
<p><br></p>
<p><u>Step 1</u>: Let’s consider the hierarchy of the <a
href="http://flare.prefuse.org">Flare</a> ActionScript visualization
library. The elements of its library are organized in several folder,
like query, data, scale… Each folder is then subdivided in subfolders
and so on. The hierarchy can be visualized as a <a
href="https://www.data-to-viz.com/graph/dendrogram.html">dendrogram</a>
as follow:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a><span class="co"># Libraries</span></span>
<span id="cb1-2"><a href="#cb1-2" tabindex="-1"></a><span class="fu">library</span>(tidyverse)</span>
<span id="cb1-3"><a href="#cb1-3" tabindex="-1"></a><span class="fu">library</span>(viridis)</span>
<span id="cb1-4"><a href="#cb1-4" tabindex="-1"></a><span class="fu">library</span>(patchwork)</span>
<span id="cb1-5"><a href="#cb1-5" tabindex="-1"></a><span class="fu">library</span>(hrbrthemes)</span>
<span id="cb1-6"><a href="#cb1-6" tabindex="-1"></a><span class="fu">library</span>(ggraph)</span>
<span id="cb1-7"><a href="#cb1-7" tabindex="-1"></a><span class="fu">library</span>(igraph)</span>
<span id="cb1-8"><a href="#cb1-8" tabindex="-1"></a></span>
<span id="cb1-9"><a href="#cb1-9" tabindex="-1"></a><span class="co"># The flare dataset is provided in ggraph</span></span>
<span id="cb1-10"><a href="#cb1-10" tabindex="-1"></a>edges <span class="ot">&lt;-</span> flare<span class="sc">$</span>edges</span>
<span id="cb1-11"><a href="#cb1-11" tabindex="-1"></a>vertices <span class="ot">&lt;-</span> flare<span class="sc">$</span>vertices <span class="sc">%&gt;%</span> <span class="fu">arrange</span>(name) <span class="sc">%&gt;%</span> <span class="fu">mutate</span>(<span class="at">name=</span><span class="fu">factor</span>(name, name))</span>
<span id="cb1-12"><a href="#cb1-12" tabindex="-1"></a>connections <span class="ot">&lt;-</span> flare<span class="sc">$</span>imports</span>
<span id="cb1-13"><a href="#cb1-13" tabindex="-1"></a></span>
<span id="cb1-14"><a href="#cb1-14" tabindex="-1"></a><span class="co"># Preparation to draw labels properly:</span></span>
<span id="cb1-15"><a href="#cb1-15" tabindex="-1"></a>vertices<span class="sc">$</span>id<span class="ot">=</span><span class="cn">NA</span></span>
<span id="cb1-16"><a href="#cb1-16" tabindex="-1"></a>myleaves<span class="ot">=</span><span class="fu">which</span>(<span class="fu">is.na</span>( <span class="fu">match</span>(vertices<span class="sc">$</span>name, edges<span class="sc">$</span>from) ))</span>
<span id="cb1-17"><a href="#cb1-17" tabindex="-1"></a>nleaves<span class="ot">=</span><span class="fu">length</span>(myleaves)</span>
<span id="cb1-18"><a href="#cb1-18" tabindex="-1"></a>vertices<span class="sc">$</span>id[ myleaves ] <span class="ot">=</span> <span class="fu">seq</span>(<span class="dv">1</span><span class="sc">:</span>nleaves)</span>
<span id="cb1-19"><a href="#cb1-19" tabindex="-1"></a>vertices<span class="sc">$</span>angle<span class="ot">=</span> <span class="dv">90</span> <span class="sc">-</span> <span class="dv">360</span> <span class="sc">*</span> vertices<span class="sc">$</span>id <span class="sc">/</span> nleaves</span>
<span id="cb1-20"><a href="#cb1-20" tabindex="-1"></a>vertices<span class="sc">$</span>hjust<span class="ot">&lt;-</span><span class="fu">ifelse</span>( vertices<span class="sc">$</span>angle <span class="sc">&lt;</span> <span class="sc">-</span><span class="dv">90</span>, <span class="dv">1</span>, <span class="dv">0</span>)</span>
<span id="cb1-21"><a href="#cb1-21" tabindex="-1"></a>vertices<span class="sc">$</span>angle<span class="ot">&lt;-</span><span class="fu">ifelse</span>(vertices<span class="sc">$</span>angle <span class="sc">&lt;</span> <span class="sc">-</span><span class="dv">90</span>, vertices<span class="sc">$</span>angle<span class="sc">+</span><span class="dv">180</span>, vertices<span class="sc">$</span>angle)</span>
<span id="cb1-22"><a href="#cb1-22" tabindex="-1"></a></span>
<span id="cb1-23"><a href="#cb1-23" tabindex="-1"></a><span class="co"># Build a network object from this dataset:</span></span>
<span id="cb1-24"><a href="#cb1-24" tabindex="-1"></a>mygraph <span class="ot">&lt;-</span> <span class="fu">graph_from_data_frame</span>(edges, <span class="at">vertices =</span> vertices)</span>
<span id="cb1-25"><a href="#cb1-25" tabindex="-1"></a></span>
<span id="cb1-26"><a href="#cb1-26" tabindex="-1"></a><span class="co"># The connection object must refer to the ids of the leaves:</span></span>
<span id="cb1-27"><a href="#cb1-27" tabindex="-1"></a>from <span class="ot">=</span> <span class="fu">match</span>( connections<span class="sc">$</span>from, vertices<span class="sc">$</span>name)</span>
<span id="cb1-28"><a href="#cb1-28" tabindex="-1"></a>to <span class="ot">=</span> <span class="fu">match</span>( connections<span class="sc">$</span>to, vertices<span class="sc">$</span>name)</span>
<span id="cb1-29"><a href="#cb1-29" tabindex="-1"></a></span>
<span id="cb1-30"><a href="#cb1-30" tabindex="-1"></a><span class="co"># Basic dendrogram</span></span>
<span id="cb1-31"><a href="#cb1-31" tabindex="-1"></a><span class="fu">ggraph</span>(mygraph, <span class="at">layout =</span> <span class="st">&#39;dendrogram&#39;</span>, <span class="at">circular =</span> <span class="cn">TRUE</span>) <span class="sc">+</span></span>
<span id="cb1-32"><a href="#cb1-32" tabindex="-1"></a>    <span class="fu">geom_edge_link</span>(<span class="at">size=</span><span class="fl">0.4</span>, <span class="at">alpha=</span><span class="fl">0.1</span>) <span class="sc">+</span></span>
<span id="cb1-33"><a href="#cb1-33" tabindex="-1"></a>    <span class="fu">geom_node_text</span>(<span class="fu">aes</span>(<span class="at">x =</span> x<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">y=</span>y<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">filter =</span> leaf, <span class="at">label=</span>shortName, <span class="at">angle =</span> angle, <span class="at">hjust=</span>hjust), <span class="at">size=</span><span class="fl">1.5</span>, <span class="at">alpha=</span><span class="dv">1</span>) <span class="sc">+</span></span>
<span id="cb1-34"><a href="#cb1-34" tabindex="-1"></a>    <span class="fu">coord_fixed</span>() <span class="sc">+</span></span>
<span id="cb1-35"><a href="#cb1-35" tabindex="-1"></a>    <span class="fu">theme_void</span>() <span class="sc">+</span></span>
<span id="cb1-36"><a href="#cb1-36" tabindex="-1"></a>    <span class="fu">theme</span>(</span>
<span id="cb1-37"><a href="#cb1-37" tabindex="-1"></a>      <span class="at">legend.position=</span><span class="st">&quot;none&quot;</span>,</span>
<span id="cb1-38"><a href="#cb1-38" tabindex="-1"></a>      <span class="at">plot.margin=</span><span class="fu">unit</span>(<span class="fu">c</span>(<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>),<span class="st">&quot;cm&quot;</span>),</span>
<span id="cb1-39"><a href="#cb1-39" tabindex="-1"></a>    ) <span class="sc">+</span></span>
<span id="cb1-40"><a href="#cb1-40" tabindex="-1"></a>    <span class="fu">expand_limits</span>(<span class="at">x =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>), <span class="at">y =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>))</span></code></pre></div>
<p><img src="edge_bundling_files/figure-html/unnamed-chunk-1-1.png" width="576" style="display: block; margin: auto;" /></p>
<p><u>Step 2</u>: now consider another level of information. Some
elements of the library have dependencies: basically they call other
elements when they are used. A naive approach to represent this
connection would be to draw a straight line (left). Instead,
hierarchical edge bundling uses a curve that follows the hierarchy link
between the 2 elements (right).</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" tabindex="-1"></a><span class="co"># Just one connection:</span></span>
<span id="cb2-2"><a href="#cb2-2" tabindex="-1"></a>from_head <span class="ot">=</span> <span class="fu">match</span>( connections<span class="sc">$</span>from, vertices<span class="sc">$</span>name) <span class="sc">%&gt;%</span> <span class="fu">head</span>(<span class="dv">1</span>)</span>
<span id="cb2-3"><a href="#cb2-3" tabindex="-1"></a>to_head <span class="ot">=</span> <span class="fu">match</span>( connections<span class="sc">$</span>to, vertices<span class="sc">$</span>name) <span class="sc">%&gt;%</span> <span class="fu">head</span>(<span class="dv">1</span>)</span>
<span id="cb2-4"><a href="#cb2-4" tabindex="-1"></a></span>
<span id="cb2-5"><a href="#cb2-5" tabindex="-1"></a><span class="co"># Basic dendrogram</span></span>
<span id="cb2-6"><a href="#cb2-6" tabindex="-1"></a>p1 <span class="ot">&lt;-</span> <span class="fu">ggraph</span>(mygraph, <span class="at">layout =</span> <span class="st">&#39;dendrogram&#39;</span>, <span class="at">circular =</span> <span class="cn">TRUE</span>) <span class="sc">+</span></span>
<span id="cb2-7"><a href="#cb2-7" tabindex="-1"></a>    <span class="fu">geom_edge_link</span>(<span class="at">size=</span><span class="fl">0.4</span>, <span class="at">alpha=</span><span class="fl">0.1</span>) <span class="sc">+</span></span>
<span id="cb2-8"><a href="#cb2-8" tabindex="-1"></a>    <span class="fu">geom_conn_bundle</span>(<span class="at">data =</span> <span class="fu">get_con</span>(<span class="at">from =</span> from_head, <span class="at">to =</span> to_head), <span class="at">alpha =</span> <span class="dv">1</span>, <span class="at">colour=</span><span class="st">&quot;#69b3a2&quot;</span>, <span class="at">width=</span><span class="dv">2</span>, <span class="at">tension=</span><span class="dv">0</span>) <span class="sc">+</span></span>
<span id="cb2-9"><a href="#cb2-9" tabindex="-1"></a>    <span class="fu">geom_node_text</span>(<span class="fu">aes</span>(<span class="at">x =</span> x<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">y=</span>y<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">filter =</span> leaf, <span class="at">label=</span>shortName, <span class="at">angle =</span> angle, <span class="at">hjust=</span>hjust), <span class="at">size=</span><span class="fl">1.5</span>, <span class="at">alpha=</span><span class="dv">1</span>) <span class="sc">+</span></span>
<span id="cb2-10"><a href="#cb2-10" tabindex="-1"></a>    <span class="fu">coord_fixed</span>() <span class="sc">+</span></span>
<span id="cb2-11"><a href="#cb2-11" tabindex="-1"></a>    <span class="fu">theme_void</span>() <span class="sc">+</span></span>
<span id="cb2-12"><a href="#cb2-12" tabindex="-1"></a>    <span class="fu">theme</span>(</span>
<span id="cb2-13"><a href="#cb2-13" tabindex="-1"></a>      <span class="at">legend.position=</span><span class="st">&quot;none&quot;</span>,</span>
<span id="cb2-14"><a href="#cb2-14" tabindex="-1"></a>      <span class="at">plot.margin=</span><span class="fu">unit</span>(<span class="fu">c</span>(<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>),<span class="st">&quot;cm&quot;</span>),</span>
<span id="cb2-15"><a href="#cb2-15" tabindex="-1"></a>    ) <span class="sc">+</span></span>
<span id="cb2-16"><a href="#cb2-16" tabindex="-1"></a>    <span class="fu">expand_limits</span>(<span class="at">x =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>), <span class="at">y =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>))</span>
<span id="cb2-17"><a href="#cb2-17" tabindex="-1"></a></span>
<span id="cb2-18"><a href="#cb2-18" tabindex="-1"></a>p2 <span class="ot">&lt;-</span> <span class="fu">ggraph</span>(mygraph, <span class="at">layout =</span> <span class="st">&#39;dendrogram&#39;</span>, <span class="at">circular =</span> <span class="cn">TRUE</span>) <span class="sc">+</span></span>
<span id="cb2-19"><a href="#cb2-19" tabindex="-1"></a>    <span class="fu">geom_edge_link</span>(<span class="at">size=</span><span class="fl">0.4</span>, <span class="at">alpha=</span><span class="fl">0.1</span>) <span class="sc">+</span></span>
<span id="cb2-20"><a href="#cb2-20" tabindex="-1"></a>    <span class="fu">geom_conn_bundle</span>(<span class="at">data =</span> <span class="fu">get_con</span>(<span class="at">from =</span> from_head, <span class="at">to =</span> to_head), <span class="at">alpha =</span> <span class="dv">1</span>, <span class="at">colour=</span><span class="st">&quot;#69b3a2&quot;</span>, <span class="at">width=</span><span class="dv">2</span>, <span class="at">tension=</span><span class="fl">0.9</span>) <span class="sc">+</span></span>
<span id="cb2-21"><a href="#cb2-21" tabindex="-1"></a>    <span class="fu">geom_node_text</span>(<span class="fu">aes</span>(<span class="at">x =</span> x<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">y=</span>y<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">filter =</span> leaf, <span class="at">label=</span>shortName, <span class="at">angle =</span> angle, <span class="at">hjust=</span>hjust), <span class="at">size=</span><span class="fl">1.5</span>, <span class="at">alpha=</span><span class="dv">1</span>) <span class="sc">+</span></span>
<span id="cb2-22"><a href="#cb2-22" tabindex="-1"></a>    <span class="fu">coord_fixed</span>() <span class="sc">+</span></span>
<span id="cb2-23"><a href="#cb2-23" tabindex="-1"></a>    <span class="fu">theme_void</span>() <span class="sc">+</span></span>
<span id="cb2-24"><a href="#cb2-24" tabindex="-1"></a>    <span class="fu">theme</span>(</span>
<span id="cb2-25"><a href="#cb2-25" tabindex="-1"></a>      <span class="at">legend.position=</span><span class="st">&quot;none&quot;</span>,</span>
<span id="cb2-26"><a href="#cb2-26" tabindex="-1"></a>      <span class="at">plot.margin=</span><span class="fu">unit</span>(<span class="fu">c</span>(<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>),<span class="st">&quot;cm&quot;</span>),</span>
<span id="cb2-27"><a href="#cb2-27" tabindex="-1"></a>    ) <span class="sc">+</span></span>
<span id="cb2-28"><a href="#cb2-28" tabindex="-1"></a>    <span class="fu">expand_limits</span>(<span class="at">x =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>), <span class="at">y =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>))</span>
<span id="cb2-29"><a href="#cb2-29" tabindex="-1"></a></span>
<span id="cb2-30"><a href="#cb2-30" tabindex="-1"></a>p1 <span class="sc">+</span> p2</span></code></pre></div>
<p><img src="edge_bundling_files/figure-html/unnamed-chunk-2-1.png" width="960" style="display: block; margin: auto;" /></p>
<p><u>Step 3</u>: Hierarchical edge bundling apply this technique to
every adjacency connection of the dataset. Also, it does not show the
hierarchy of the dataset to decrease the clutter as much as possible. It
results in a smooth eye catching figure where connection get obvious and
the clutter minimal. Here is an analogy suggested by the inventor of
this technique:</p>
<blockquote>
<p>… as bundling your electrical wires together in order to reduce
clutter, while fanning them out at their terminus in order to plus them
in.</p>
</blockquote>
<div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1" tabindex="-1"></a><span class="co"># Make the plot</span></span>
<span id="cb3-2"><a href="#cb3-2" tabindex="-1"></a><span class="fu">ggraph</span>(mygraph, <span class="at">layout =</span> <span class="st">&#39;dendrogram&#39;</span>, <span class="at">circular =</span> <span class="cn">TRUE</span>) <span class="sc">+</span></span>
<span id="cb3-3"><a href="#cb3-3" tabindex="-1"></a>    <span class="fu">geom_conn_bundle</span>(<span class="at">data =</span> <span class="fu">get_con</span>(<span class="at">from =</span> from, <span class="at">to =</span> to), <span class="at">alpha =</span> <span class="fl">0.1</span>, <span class="at">colour=</span><span class="st">&quot;#69b3a2&quot;</span>) <span class="sc">+</span></span>
<span id="cb3-4"><a href="#cb3-4" tabindex="-1"></a>    <span class="fu">geom_node_text</span>(<span class="fu">aes</span>(<span class="at">x =</span> x<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">y=</span>y<span class="sc">*</span><span class="fl">1.01</span>, <span class="at">filter =</span> leaf, <span class="at">label=</span>shortName, <span class="at">angle =</span> angle, <span class="at">hjust=</span>hjust), <span class="at">size=</span><span class="fl">1.5</span>, <span class="at">alpha=</span><span class="dv">1</span>) <span class="sc">+</span></span>
<span id="cb3-5"><a href="#cb3-5" tabindex="-1"></a>    <span class="fu">coord_fixed</span>() <span class="sc">+</span></span>
<span id="cb3-6"><a href="#cb3-6" tabindex="-1"></a>    <span class="fu">theme_void</span>() <span class="sc">+</span></span>
<span id="cb3-7"><a href="#cb3-7" tabindex="-1"></a>    <span class="fu">theme</span>(</span>
<span id="cb3-8"><a href="#cb3-8" tabindex="-1"></a>      <span class="at">legend.position=</span><span class="st">&quot;none&quot;</span>,</span>
<span id="cb3-9"><a href="#cb3-9" tabindex="-1"></a>      <span class="at">plot.margin=</span><span class="fu">unit</span>(<span class="fu">c</span>(<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>,<span class="dv">0</span>),<span class="st">&quot;cm&quot;</span>),</span>
<span id="cb3-10"><a href="#cb3-10" tabindex="-1"></a>    ) <span class="sc">+</span></span>
<span id="cb3-11"><a href="#cb3-11" tabindex="-1"></a>    <span class="fu">expand_limits</span>(<span class="at">x =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>), <span class="at">y =</span> <span class="fu">c</span>(<span class="sc">-</span><span class="fl">1.2</span>, <span class="fl">1.2</span>))</span></code></pre></div>
<p><img src="edge_bundling_files/figure-html/unnamed-chunk-3-1.png" width="672" style="display: block; margin: auto;" /></p>
<p><em>Note</em>: This example uses the famous <code>flare</code>
example provided in the <a
href="https://github.com/thomasp85/ggraph/blob/master/R/data_flare.R">ggraph
R library</a>.</p>
<p><em>Reference</em>: Hierarchical edge bundling is a method developped
by: D. Holten 2006. <a
href="https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=4015425">Hierarchical
Edge Bundles: Visualization of Adjacency Relations in Hierarchical
Data</a>. <em>IEEE Transactions on Visualization and Computer Graphics
12(5)</em>.</p>
</div>
<div id="what-for" class="section level1">
<h1>What for</h1>
<hr />
<p>Hierarchical edge bundling reduces visual clutter and also visualizes
implicit adjacency edges between parent nodes that are the result of
explicit adjacency edges between their respective child nodes.
Furthermore, hierarchical edge bundling is a generic method which can be
used in conjunction with existing tree visualization techniques.</p>
<p>Here is an example showing the same dataset with and without the use
of bundling. The use of straight line on the left results in a cluttered
figure that makes impossible to read the connection. The use of bundling
on the right makes a neat figure:</p>
<br><br>
<center>
<img src="IMG/bundle_compare.png" alt="img" width="600" height="700">
</center>
<p><br><br></p>
<p><em>source</em>: <a
href="https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=4015425">Holten
2006.</a></p>
</div>
<div id="variation" class="section level1">
<h1>Variation</h1>
<hr />
<p>Because I love this kind of graphic so much, I feel like displaying a
few examples</p>
<ul>
<li>Application of edge bundling on maps, with a method that do not even
need a hierarchy: it uses a self-organizing approach to bundling.
<em>Source</em>: Holten et al. 2009. <a
href="https://www.win.tue.nl/vis1/home/dholten/papers/forcebundles_eurovis.pdf">Force-Directed
Edge Bundling for Graph Visualization</a>.</li>
</ul>
<br><br>
<center>
<img src="IMG/bundle_map.png" alt="img" width="800" height="900">
</center>
<p><br><br></p>
<ul>
<li>The <a
href="http://truth-and-beauty.net/projects/well-formed-eigenfactor">Eigen
factor project</a> study citation patterns between scientific journals.
<em>Moritz Stefaner</em> used this data to build beautiful visuals using
the hierarchical edge bundling technique:</li>
</ul>
<br>
<center>
<img src="IMG/bundle_eigen.png" alt="img" width="600" height="600">
</center>
</div>
<div id="related" class="section level1">
<h1>Related</h1>
<hr />
<div class="row">
<div class="col-lg-3 col-md-6 col-sm-6">
<a href="https://www.data-to-viz.com/graph/network.html" class="btn btn-primary mybtnrelated" style="margin-bottom:4px;white-space: normal !important;">
<img  src="https://github.com/holtzy/data_to_viz/raw/master/img/section/NetworkSmall.png">
<p class="mytitlerelated">
Network
</p>
<p class="mytextrelated">
Represents relationships using nodes and edges.
</p>
</a>
</div>
<div class="col-lg-3 col-md-6 col-sm-6">
<a href="https://www.data-to-viz.com/graph/arc.html" class="btn btn-primary mybtnrelated" style="margin-bottom:4px;white-space: normal !important;">
<img  src="https://github.com/holtzy/data_to_viz/raw/master/img/section/ArcSmal.png">
<p class="mytitlerelated">
Arc diagram
</p>
<p class="mytextrelated">
A subset of the network diagram where nodes are aligned and edges are
arcs.
</p>
</a>
</div>
<div class="col-lg-3 col-md-6 col-sm-6">
<a href="https://www.data-to-viz.com/graph/sankey.html" class="btn btn-primary mybtnrelated" style="margin-bottom:4px;white-space: normal !important;">
<img  src="https://github.com/holtzy/data_to_viz/raw/master/img/section/SankeySmall.png">
<p class="mytitlerelated">
Sankey diagram
</p>
<p class="mytextrelated">
A flow diagram in which the width of the arrows is shown proportionally
to the flow quantity.
</p>
</a>
</div>
<div class="col-lg-3 col-md-6 col-sm-6">
<a href="https://www.data-to-viz.com/graph/chord.html" class="btn btn-primary mybtnrelated" style="margin-bottom:4px;white-space: normal !important;">
<img  src="https://github.com/holtzy/data_to_viz/raw/master/img/section/ChordSmall.png">
<p class="mytitlerelated">
Chord diagram
</p>
<p class="mytextrelated">
A circular layout used to display weighted relationships between
entities through arcs.
</p>
</a>
</div>
</div>
</div>
<div id="code" class="section level1">
<h1>Build your own</h1>
<hr />
<p>The <a
href="https://r-graph-gallery.com/hierarchical-edge-bundling.html">R</a>,
<a
href="https:/python-graph-gallery.com/hierarchical-edge-bundling/">Python</a>,
<a
href="https://www.react-graph-gallery.com/hierarchical-edge-bundling">React</a>
and <a href="https://d3-graph-gallery.com/bundle.html">D3</a> graph
galleries are 4 websites providing hundreds of chart example, always
providing the reproducible code. Click the button below to see how to
build the chart you need with your favorite programing language.</p>
<p>
<a href="https://r-graph-gallery.com/hierarchical-edge-bundling.html" class="btn btn-primary">R
graph gallery</a>
<a href="https://python-graph-gallery.com/hierarchical-edge-bundling/" class="btn btn-primary">Python
gallery</a>
<a href="https://www.react-graph-gallery.com/hierarchical-edge-bundling" class="btn btn-primary">React
gallery</a>
<a href="https://d3-graph-gallery.com/bundle.html" class="btn btn-primary">D3
gallery</a>
</p>
</div>
</div>

          <section
            id="form"
            style="
              margin-top: 70px;
              padding-bottom: 70px;
              padding-top: 70px;
              background-color: #f8f9fa;
            "
          >
            <div class="container">
              <div
                style="
                  display: flex;
                  flex-direction: column;
                  align-items: center;
                "
              >
                <h2 style="font-size: 44px" class="text-center">
                  Dataviz decision tree
                </h2>
                <p
                  class="text-center"
                  style="max-width: 600px; font-size: 18px"
                >
                  <a href="https://www.data-to-viz.com">Data To Viz</a> is a
                  comprehensive <b>classification of chart types</b> organized
                  by data input format. Get a high-resolution version of our
                  decision tree delivered to your inbox now!
                </p>
                <div
                  style="
                    margin-top: -50px;
                    width: 100%;
                    display: flex;
                    justify-content: center;
                  "
                >
                  <script
                    async
                    data-uid="8010f15fd2"
                    src="https://prodigious-trailblazer-3628.ck.page/8010f15fd2/index.js"
                  ></script>
                </div>
                <br />
                <div class="text-center">
                  <img
                    class="img-fluid"
                    src="../img/poster/poster_small.png"
                    alt="High Resolution Poster"
                    style="max-width: 400px"
                  />
                </div>
              </div>
            </div>
          </section>

           &nbsp;
<hr />
<p style="text-align: center;">A work by <a href="https://www.yan-holtz.com/">Yan Holtz</a> for <a href="https://data-to-viz.com">data-to-viz.com</a></p>

<!-- Add icon library -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<!-- Add font awesome icons -->
<p style="text-align: center;">
	<a href="https://twitter.com/r_graph_gallery?lang=en" class="fa fa-twitter"></a>
	<a href="https://www.linkedin.com/in/yan-holtz-2477534a/" class="fa fa-linkedin"></a>
	<a href="https://github.com/holtzy/" class="fa fa-github"></a>
</p>

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-79254642-3"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-79254642-3');
</script>
<script>
var getOutboundLink = function(url) {
	gtag('event', 'click', {
		'event_category': 'outbound',
		'event_label': url,
		'transport_type': 'beacon',
		'event_callback': function(){document.location = url;}
	});
}
</script>

&nbsp;                </div>

    <script>

      // add bootstrap table styles to pandoc tables
      function bootstrapStylePandocTables() {
        $('tr.header').parent('thead').parent('table').addClass('table table-condensed');
      }
      $(document).ready(function () {
        bootstrapStylePandocTables();
      });

          </script>
       </body>
</html>
